﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using Oracle.DataAccess.Client;

namespace Petaframe.DataAccess
{
    /// <summary>
    /// Insert,Update,Delete işlemlerinin tamamının bir transaction altında tek seferde yapılmasını sağlar.
    /// <para>Örneğin iki defa insert, bir defa update metodunu çağırdıktan sonra Commit() metodunu çağırdığınızda, yaptığınız tüm işlemler
    /// toplu olarak tek seferde veritabanına gönderilir. Tüm işlemler transaction ile yapılır. Eğer gönderilen işlemlerden herhangi birtanesi hata verirse, 
    /// tüm işlemler geri alınır ve hiç biri çalıştırılmaz.</para>
    /// </summary>
    public interface IUnitOfWork : IDisposable
    {
        /// <summary>
        /// Insert işlemi yapar
        /// </summary>
        /// <typeparam name="T">Eklenecek sınıf</typeparam>
        /// <param name="item">Eklenecek sınıf</param>
        void Insert<T>(T item);
        /// <summary>
        /// Insert işlemi yapar
        /// </summary>
        /// <param name="commandText">Ekleme işlemi için kullanılacak komut.</param>
        /// <param name="commandType">Komut tipi.</param>  
        void Insert(string command, CommandType commandType = CommandType.Text);
        /// <summary>
        /// Update işlemi yapar
        /// </summary>
        /// <typeparam name="T">Güncellenecek sınıf.</typeparam>
        /// <param name="item">Güncellenecek sınıf.</param>
        void Update<T>(T item);
        /// <summary>
        /// Update işlemi yapar
        /// </summary>
        /// <param name="commandText">Güncelleme işlemi için kullanılacak komut.</param>
        /// <param name="commandType">Komut tipi.</param>
        void Update(string command, CommandType commandType = CommandType.Text);
        /// <summary>
        /// Delete işlemi yapar
        /// </summary>
        /// <typeparam name="T">Silincek sınıf</typeparam>
        /// <param name="item">Silinecek sınıf</param>
        void Delete<T>(T item) ;
        /// <summary>
        /// Delete işlemi yapar
        /// </summary>
        /// <param name="commandText">Silme işlemi için kullanılacak komut.</param>
        /// <param name="commandType">Komut tipi.</param>
        void Delete(string command, CommandType commandType = CommandType.Text);
        /// <summary>
        /// Parametre olarak verilen DataTable nesnesi üzerinde yapılan tüm işlemleri veritabanına gönderir.
        /// </summary>
        /// <param name="item">Üzerinde işlem yapılacak olan nesne</param>
        void PersistTable(DataTable item);
        /// <summary>
        /// Parametre olarak sql cümlesi alan metodlar için, veritabanı parametresi eklemek amacıyla kullanılır.
        /// </summary>
        /// <param name="parameterName">Parametre adı.</param>
        /// <param name="parameterValue">Parametre değeri.</param>
        /// <param name="dataType">Parametrenin sqlserver veritabanında ki tipi.</param>
        void AddInputParameter(string parameterName, object parameterValue, DbType dbType);
        /// <summary>
        /// Parametre olarak sql cümlesi alan metodlar için, veritabanı parametresi eklemek amacıyla kullanılır.
        /// </summary>
        /// <param name="parameterName">Parametre adı.</param>
        /// <param name="parameterValue">Parametre değeri.</param>
        /// <param name="dataType">Parametrenin Oracle veritabanında ki tipi.</param>
        void AddInputParameter(string parameterName, object parameterValue, OracleDbType dbType);
        /// <summary>
        /// Yapılan tüm işlemlerin veritabanına gönderilip bir transaction altında toplu olarak çalıştırılmasını sağlar.
        /// </summary>
        void Commit();
        /// <summary>
        /// Veritabanına gönderilen işlemlerden herhangi biri hata verirse bu komut tüm işlemleri geri alır.
        /// </summary>
        void RollBack();
    }
}
